//
//  HMHomeTableViewController.swift
//  WeiBo14
//
//  Created by HM on 16/3/2.
//  Copyright © 2016年 HM. All rights reserved.
//

import UIKit

class HMHomeTableViewController: HMVisitorViewController {

    private let HMStatausCellID = "HMStatausCellID"
    
    // 当前控制器(view) 对应的视图模型
    lazy var statusListViewModel: HMStatusListViewModel = HMStatusListViewModel()
    
    // var statusArray: [HMStatus]?
    // MARK: - 设置视图
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 如果没有登录,去设置没有登录的访客视图信息
        if !userLogon {
            // 拿到访客视图View,去设置信息
            visitorView.setPageInfo(nil, message: nil)
            return
        }
        // 设置视图
        setupUI()
        // 加载数据
        loadData()
    }
    
    /// 设置视图
    private func setupUI(){
        // 添加pullDownTipLabel到导航栏的下面
        self.navigationController!.view.insertSubview(pullDownTipLabel, belowSubview: navigationController!.navigationBar)
        // 设置pullDownTipLabel的Y值
        pullDownTipLabel.frame.origin.y = CGRectGetMaxY(navigationController!.navigationBar.frame) - pullDownTipLabel.frame.height
        
        navigationItem.leftBarButtonItem = UIBarButtonItem(imageNamed: "navigationbar_friendsearch", target: nil, action: nil)
        navigationItem.rightBarButtonItem = UIBarButtonItem(imageNamed: "navigationbar_pop", target: self, action: "pop")
        setupTableView()
    }
    
    
    // 设置tableView
    private func setupTableView(){
        tableView.registerClass(HMStatusCell.self, forCellReuseIdentifier: HMStatausCellID)
        // 因为cell高度随着内容高度变化而变化,那么就不能写死cell的高度
        // tableView.rowHeight = 250
        // 设置tableView的行高去自动计算
        tableView.rowHeight = UITableViewAutomaticDimension
        // 设置tableView的预估行高
        // 先让tableView能滚动起来,然后当有一个cell需要显示的话就去计算该cell的行高,并且调整tableView的滚动的范围,越精准越好
        tableView.estimatedRowHeight = 300
        
        // 隐藏tableView分割线
        tableView.separatorStyle = .None
        tableView.backgroundColor = UIColor(white: 239/255, alpha: 1)
        
        // 给tableView添加一个底部视图,菊花转
        tableView.tableFooterView = pullUpView
        
//        refreshControl = UIRefreshControl()
//        refreshControl?.addTarget(self, action: "loadData", forControlEvents: UIControlEvents.ValueChanged)
        tableView.addSubview(hmRefreshControl)
        hmRefreshControl.addTarget(self, action: "loadData", forControlEvents: UIControlEvents.ValueChanged)
    }
    
//    @objc private func refresh(){
//        print("调用下拉刷新的方法")
//        refreshControl?.endRefreshing()
//    
//    }
    
    // MARK: - 私有方法
    
    private func showPullDownTipLabel(count: Int) {
        
        if pullDownTipLabel.hidden == false {
            // 如果是显示的,直接返回
            return
        }
        
        
        let countText = count == 0 ? "没有新的数据" : "加载了\(count)条数据"
        self.pullDownTipLabel.text = countText
        // 让其显示
        self.pullDownTipLabel.hidden = false
        UIView.animateWithDuration(1, animations: { () -> Void in
            self.pullDownTipLabel.frame.origin.y += self.pullDownTipLabel.frame.height
        }) { (_) -> Void in
            UIView.animateWithDuration(1, delay: 1, options: [], animations: { () -> Void in
                self.pullDownTipLabel.frame.origin.y -= self.pullDownTipLabel.frame.height
            }, completion: { (_) -> Void in
                self.pullDownTipLabel.hidden = true
            })
        }
    }
    
    @objc private func loadData(){
        // 在这里面去调用视图模型身上的加载数据的方法
        statusListViewModel.loadData(pullUpView.isAnimating(), finished: { (isSuccess, count) -> () in
            if isSuccess {
                self.tableView.reloadData()
                print("本次加载了\(count)条数据")
                
                if !self.pullUpView.isAnimating() {
                    // 显示下拉刷新的控件
                    self.showPullDownTipLabel(count)
                }
            }else{
                print("请求失败")
            }
            // 停止刷新控件的动画
            self.endRefresh()
        })
    }

    // 结束刷新
    private func endRefresh(){
        pullUpView.stopAnimating()
        // refreshControl?.endRefreshing()
        hmRefreshControl.endRefreshing()
    }
    
    // MARK: - 监听事件
    func pop(){
        let vc = HMTempViewController()
        navigationController?.pushViewController(vc, animated: true)
    }
    
    // MARK: - 懒加载
    
    // 上拉加载控件
    private lazy var pullUpView: UIActivityIndicatorView = {
        let indicatiorView = UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorViewStyle.WhiteLarge)
        // 指定颜色
        indicatiorView.color = UIColor.purpleColor()
//        // 测试: 开始动画
//        indicatiorView.startAnimating()
        
        return indicatiorView
    }()
    
    // 下拉刷新控件
    private lazy var hmRefreshControl: HMRefreshControl = HMRefreshControl()
    
    // 下拉刷新提示的控件
    private lazy var pullDownTipLabel: UILabel = {
        let label = UILabel(textColor: UIColor.whiteColor(), fontSize: 12)
        label.frame.size = CGSize(width: SCREENW, height: 35)
        label.backgroundColor = UIColor.orangeColor()
        // self.view.addSubview(label)
        label.hidden = true
        label.textAlignment = .Center
        return label
    }()
}

extension HMHomeTableViewController {
    
    // 返回多少行
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
//        return self.statusArray?.count ?? 0
        return statusListViewModel.statusArray?.count ?? 0
    }
    
    // 返回cell
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        // 去缓存中取,如果没有取到,就帮我们创建一个cell返回,建议以后采用此种方式去取cell
        let cell = tableView.dequeueReusableCellWithIdentifier(HMStatausCellID, forIndexPath: indexPath) as! HMStatusCell
        
        // 给cell设置视图模型
        cell.statusViewModel = statusListViewModel.statusArray![indexPath.row]
        // 给cell赋值
//        cell.textLabel?.text = statusListViewModel.statusArray![indexPath.row].user?.screen_name
        return cell
    }
    
    // 将要展示某个cell的时候,会回调这个方法.
    // 只需要在这个方法判断该cell是否是最后一个cell,如果是那么就去加载更多数据
    override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
        
        if indexPath.row == statusListViewModel.statusArray!.count - 1 && pullUpView.isAnimating() == false {
            // 1. 让菊花转转起来 --> 代表进入上拉加载的状态
            pullUpView.startAnimating()
            // 2. 去加载数据
            print("去加载数据")
            self.loadData()
        }
    }
    
    // 如果以后开发,行高是固定的,建议真接设置rowHeight,不要实现此方法,此方法效率没有直接设置rowHeight高
//    override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
//        return 100
//    }
}
